package org.tlipoca.smarticletag.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.genntii.smcommon.constant.ArticleTagStatusConstant;
import org.genntii.smcommon.constant.ExceptionConstant;
import org.genntii.smcommon.exception.ArticleTagNotFoundException;
import org.genntii.smdomain.doc.VO.ArticleTagDocVO;
import org.genntii.smdomain.dto.ArticleTagDTO;
import org.genntii.smdomain.entity.ArticleTag;
import org.genntii.smdomain.vo.ArticleTagVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.tlipoca.smarticletag.mapper.ArticleTagMapper;
import org.tlipoca.smarticletag.service.ArticleTagService;

import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

@Slf4j
@Service
public class ArticleTagServiceImpl extends ServiceImpl<ArticleTagMapper, ArticleTag> implements ArticleTagService {

    @Autowired
    private ArticleTagMapper articleTagMapper;

    @Override
    public Boolean articleTagListExistsService(ArrayList<Long> tagIds) {
        Integer count = articleTagMapper.selectArticleTagCountByIds(tagIds);
        return tagIds.size() == count;
    }

    @Override
    public ArrayList<ArticleTagVO> getArticleTagListByTagId(ArrayList<Long> tagIds) {
        ArrayList<ArticleTag> articleTags = articleTagMapper.selectArticleTagListByIds(tagIds);
        ArrayList<ArticleTagVO> articleTagVOS = new ArrayList<>();
        for (int i = 0; i < articleTags.size(); i++){
            DateTimeFormatter dateTimeFormat =  DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            articleTagVOS.add(ArticleTagVO.builder()
                    .id(articleTags.get(i).getId())
                    .tagName(articleTags.get(i).getTagName())
                    .tagDescription(articleTags.get(i).getTagDescription())
                    .status(articleTags.get(i).getStatus())
                    .createTime(articleTags.get(i).getCreateTime().format(dateTimeFormat))
//                    .update_time(articleTags.get(i).getUpdate_time().format(dateTimeFormat))
                    .build());
        }
        return articleTagVOS;

    }

    @Override
    public ArrayList<ArticleTagDocVO> getArticleTagDocVOListByTagId(ArrayList<Long> tagIds) {
        ArrayList<ArticleTag> articleTags = articleTagMapper.selectArticleTagListByIds(tagIds);
        ArrayList<ArticleTagDocVO> tagDocVOS = new ArrayList<>();
        for (ArticleTag tag:articleTags){
            ArticleTagDocVO tagDocVO = new ArticleTagDocVO(tag.getId(),tag.getTagName());
            tagDocVOS.add(tagDocVO);
        }
        return tagDocVOS;
    }

    @Override
    public void addArticleTagService(ArticleTagDTO articleTagDTO) {
        ArticleTag articleTag = new ArticleTag();
        BeanUtils.copyProperties(articleTagDTO, articleTag);
        articleTag.setStatus(ArticleTagStatusConstant.ARTICLE_TAG_VISIBLE);
        articleTagMapper.insert(articleTag);
    }

    @Override
    public void deleteArticleTagService(Long tagId) {
        // 判断文章标签是否存在
        if(!articleTagMapper.exists(new QueryWrapper<ArticleTag>().eq("id", tagId))){
            log.info("文章标签不存在 id: {}", tagId);
            throw new ArticleTagNotFoundException(ExceptionConstant.ARTICLE_TAG_NOT_FOUND_EXCEPTION);
        }

        // 删除文章标签
        articleTagMapper.deleteById(tagId);
    }

    @Override
    public void updateArticleTagService(Long tagId, ArticleTagDTO articleTagDTO) {
        // 判断文章标签是否存在
        if(!articleTagMapper.exists(new QueryWrapper<ArticleTag>().eq("id", tagId))){
            log.info("文章标签不存在 id: {}", tagId);
            throw new ArticleTagNotFoundException(ExceptionConstant.ARTICLE_TAG_NOT_FOUND_EXCEPTION);
        }

        ArticleTag articleTag = new ArticleTag();
        BeanUtils.copyProperties(articleTagDTO, articleTag);
        articleTag.setId(tagId);

        articleTagMapper.updateById(articleTag);
    }

    @Override
    public Map<String, ArrayList<ArticleTagVO>> getArticleTagListByArticleTagMapService(Map<String , ArrayList<Long>> articleTagMap) {

        Map<String , ArrayList<ArticleTagVO>> map = new HashMap<>();

        articleTagMap.forEach((key, value) -> {

            ArrayList<ArticleTag> articleTags = articleTagMapper.selectArticleTagListByIds(value);
            ArrayList<ArticleTagVO> articleTagVOS = new ArrayList<>();
            for (int i = 0; i < articleTags.size(); i++){
                DateTimeFormatter dateTimeFormat =  DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                articleTagVOS.add(ArticleTagVO.builder()
                        .id(articleTags.get(i).getId())
                        .tagName(articleTags.get(i).getTagName())
                        .tagDescription(articleTags.get(i).getTagDescription())
                        .status(articleTags.get(i).getStatus())
                        .createTime(articleTags.get(i).getCreateTime().format(dateTimeFormat))
//                        .update_time(articleTags.get(i).getUpdate_time().format(dateTimeFormat))
                        .build());

            }
            map.put(key, articleTagVOS);

        });

        return map;
    }

    @Override
    public ArrayList<ArticleTagVO> getArticleTagList() {
        ArrayList<ArticleTag> articleTags = articleTagMapper.selectArticleTagList();
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        ArrayList<ArticleTagVO> articleTagVOS = new ArrayList<>();
        for (ArticleTag articleTag:articleTags){
            articleTagVOS.add(ArticleTagVO.builder()
                    .id(articleTag.getId())
                    .tagName(articleTag.getTagName())
                    .tagDescription(articleTag.getTagDescription())
                    .status(articleTag.getStatus())
                    .createTime(dateTimeFormatter.format(articleTag.getCreateTime()))
                    .updateTime(dateTimeFormatter.format(articleTag.getUpdateTime()))
                    .build());
        }
        return articleTagVOS;
    }
}
